// 二次封装aixos
import axios from "axios";
import { ElMessage } from "element-plus"; // 添加 ElMessage 导入
import { useUserStore } from "@/store/modules/user";
import router from "@/router";

// 创建axios实例
let request = axios.create({
  // 基础路径
  baseURL: import.meta.env.VITE_APP_BASE_API, //基础路径上会携带/api
  // 超时实践
  timeout: 3600,
});

// 存储等待的请求
let waitingQueue = [];

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    const userStore = useUserStore();

    // 从localStorage获取token添加到请求头
    const token = localStorage.getItem("token");
    if (token) {
      config.headers["Authorization"] = `Bearer ${token}`;
    }
    // 如果用户已登录且请求需要授权，添加 token
    // if (userStore.isLoggedIn()) {
    //   config.headers["Authorization"] = `Bearer ${userStore.token}`;
    // }
    return config;
  },
  (error) => {
    console.error("请求错误:", error);
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    // 如果响应是二进制流，则直接返回，用于下载文件、Excel 导出等
    if (response.config.responseType === "blob") {
      return response;
    }
    const { code, data, msg } = response.data;
    if (code === 200) {
      return data;
    }
    ElMessage.error(msg || "系统出错");
    return Promise.reject(new Error(msg || "Error"));
  },
  async (error) => {
    const userStore = useUserStore();

    // 如果请求被取消，直接返回
    if (axios.isCancel(error)) {
      return Promise.reject(error);
    }

    const { response } = error;
    console.error("响应错误:", response, error);

    // 处理 401 未授权错误
    if (response && response.status === 401) {
      // 如果 token 存在但已过期
      if (userStore.token && !isRefreshing) {
        // 标记为正在刷新，避免多个请求重复处理
        isRefreshing = true;

        try {
          // 处理 token 过期（可能会添加 token 刷新逻辑）

          // 方案1: 如果你有刷新 token 的机制，可以在这里尝试刷新
          // const refreshToken = localStorage.getItem('refreshToken');
          // if (refreshToken) {
          //   const result = await refreshTokenApi(refreshToken);
          //   if (result.success) {
          //     userStore.setToken(result.token, result.expires);
          //     // 重试队列中的请求
          //     waitingQueue.forEach(resolve => resolve());
          //     waitingQueue = [];
          //     return service(error.config);
          //   }
          // }

          // 方案2: 如果没有刷新 token 机制，就清除用户信息并提示重新登录

          // 先判断是否在需要认证的路由
          const requiresAuth = router.currentRoute.value.meta.requiresAuth;

          // 清除用户数据
          userStore.clearUserData();

          // 如果当前路由需要认证，显示消息提示用户
          if (requiresAuth) {
            // 如果多个请求同时失败，只显示一个对话框
            await ElMessageBox.confirm(
              "您的登录已过期，请重新登录",
              "会话过期",
              {
                confirmButtonText: "重新登录",
                cancelButtonText: "取消",
                type: "warning",
                closeOnClickModal: false,
              }
            )
              .then(() => {
                // 打开登录弹窗
                userStore.openAuthModal("login");

                // 如果是在需要认证的页面，重定向到首页
                router.push("/selected");
              })
              .catch(() => {
                // 用户点击取消，也跳转到首页
                router.push("/selected");
              });
          } else {
            // 在不需要认证的路由，只显示消息不打开弹窗
            ElMessage.warning("登录已过期");
          }
        } finally {
          // 重置刷新标记
          isRefreshing = false;
        }
      } else if (!userStore.token) {
        // 未登录状态下的 401，提示用户登录
        ElMessage.warning("请先登录");
        userStore.openAuthModal("login");
      }

      // 返回错误，阻止原请求继续执行
      return Promise.reject(error);
    }

    // 添加错误处理逻辑
    const errorMessage =
      error.response?.data?.message || "网络错误，请稍后重试";
    ElMessage.error(errorMessage);
    return Promise.reject(error.response.data);
  }
);

// 对外暴露
export default request;
